bum.socket = {
	ready : false,
	pollUrl : (bum.isDebug ? 'http://local.me.ola.vn/sock-poll' : 'http://bum.vn/sock/poll'),

	SOCKET_READY : 'SOCKET_READY',
	SOCKET_CLOSED : 'SOCKET_CLOSED',

	id : null,
	wsc : null,
	// pollUrl : 'http://bum.vn/sock/poll',

	inited : false,
	frame : null,
	init : function() {
		if (bum.socket.inited) {
			return;
		}
		bum.socket.inited = true;

		bum.socket.frame = $('#frameSocket');
		$.getJSON(bum.socket.pollUrl + '/id?callback=?', function(data) {
			bum.socket.id = data[0];
			bum.socket.wsc = data[1];
			// ghi vào cookie và đọc trở lại...

			bum.socket.frame.prop('src', bum.socket.pollUrl + '/wait?id=' + bum.socket.id + '&wsc=' + bum.socket.wsc + '&callback=bum.socket.get');

			bum.socket.checkPing();
		});
	},
	stop : function() {
		bum.socket.inited = false;
		bum.socket.ready = false;
		
		if (bum.socket.frame) {
			bum.socket.frame.prop('src', '');
		}

		if (bum.socket.timer !== null) {
			clearInterval(bum.socket.timer);
		}
	},

	timer : null,
	lastPing : 0,
	ping : function() {
		bum.socket.lastPing = $.now();

		if (!bum.socket.ready) {
			bum.listener.fire(bum.socket.SOCKET_READY);
			bum.socket.ready = true;
		}
	},
	checkPing : function() {
		if (bum.socket.timer !== null) {
			clearInterval(bum.socket.timer);
		}

		bum.socket.timer = setInterval(function() {
			if (bum.chat) {
				$.post(bum.chat.url, {
					act : bum.chat.keys.FUNC_PING,
					id : bum.socket.id,
					wsc : bum.socket.wsc
				});
			}

			if ($.now() - bum.socket.lastPing > 22000) {
				if (bum.socket.ready) {
					console.log('closed');
					bum.listener.fire(bum.socket.SOCKET_CLOSED);
				}
				bum.socket.ready = false;

				$('#frameSocket').attr('src', function(i, val) {
					return val;
				});
			}
		}, 7000);
	},

	get : function(data) {
		bum.socket.ping();

		if (data === 'ping') {
			console.log('oh yeah...');
		} else if (data.app && bum.socket.app[data.app]) {
			bum.socket.app[data.app](data);
		}
	},
	app : {}
};